//
// Created by codex on 2024/5/29.
//

#include "FreeRTOS_Task.h"
#include "cmsis_os2.h"
#include "usart.h"
#include "tim.h"
#include "Peripheral.h"
#include "mlx90614.h"
#include "Drv_Screen.h"
#include "flash.h"

void StartU2Task(void *argument)
{
    int sta = 0;
    int time_cnt=0;
    for(;;)
    {
        if(uart[0].state != sta)
        {
            time_cnt = 0;
            sta = uart[0].state;
            //TODO

        }
        else
        {
            if(time_cnt >= 1000)
            {
                //TODO:断联处理函数
            }
            else
            {
                time_cnt += 10;
            }
        }
        osDelay(10);
    }
}

void StartU3Task(void *argument) //接主控
{
    int sta = 0;
    int time_cnt=0;
    for(;;)
    {
        if(uart[1].state != sta)
        {
            time_cnt = 0;
            sta = uart[1].state;
            Debug_log("get data:%.2X %.2X", uart[1].date[1], uart[1].date[2]);
            if(uart[1].date[1] == ACE_TYPE)
            {
                Debug_log("get fmu data");
                UpperComputer_DataAnl(uart[1].date); //分析串口接受的主控数据
            }
            else
            {
//                Debug_log("get screen data");
                Transmit_upData2SCreen(uart[1].date); //如果是屏幕数据则转发
            }
        }
        else
        {
            if(time_cnt >= 1000)
            {
                //TODO:断联处理函数
            }
            else
            {
                time_cnt += 10;
            }
        }
        Mix_Send_Data_2Up(0xE0); //数据串口发送给主控 //0xA0为摄像头数据
        Mix_Send_Data_2Up(0xE1);//

        osDelay(20);
    }
}
extern unsigned char camera_x,camera_y,mode,color_select;
extern PERI PERI_1;
void StartU4Task(void *argument) //uart4 接摄像头
{
    int sta = 0;
    int time_cnt;
    for(;;)
    {
        if(uart[2].state != sta)
        {

            time_cnt = 0;
            sta = uart[2].state;
            //TODO

            if(uart[2].date[0]==0x3f&&uart[2].date[5]==0xff)
            {

                mode=uart[2].date[1];
                color_select=uart[2].date[2];
                camera_x = uart[2].date[3];
                camera_y = uart[2].date[4];
                //print_UARTx(&huart3, "mode:%d",mode);
            }

        }
        else
        {
            if(time_cnt >= 1000)
            {
                //TODO:断联处理函数
                //PERI_1.BEEP_STA=0;
            }
            else
            {
                time_cnt += 10;
            }
        }
        Mix_Send_Data_2Camera(0xF4);
        osDelay(20);
    }
}
extern uint8_t Screen_data_t[50];
void StartU6Task(void *argument)
{//link to screen
    int sta = 0;
    int time_cnt,len;
    for(;;)
    {
        if(uart[3].state != sta)
        {
            time_cnt = 0;
            sta = uart[3].state;
            len=Screen_DataAnl(uart[3].date);
            if(len != 0xFF)
            {
                Transmit_SCreenData2up(len, Screen_data_t);
            }
        }
        else
        {
            if(time_cnt >= 1000)
            {
                //TODO:断联处理函数
            }
            else
            {
                time_cnt += 10;
            }
        }
        //Mix_Send_Data_2Up(0xE2);
        osDelay(10);
    }
}
uint8_t beep_t=0;
extern PERI PERI_1;
extern union FloatData temp;
void StartPeriTask(void *argument) //感觉得不止一个任务
{
    int sta = 0;
    int time_cnt;
    uint8_t flash_data[10];
    uint8_t flash_data_read[10];
    myPERI_init();
    HAL_TIM_Base_Start_IT(&htim6);
    //HAL_TIM_Base_Start_IT(&htim3);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//舵机
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);//舵机

    HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_3);//蜂鸣器

    //flash_data[0]=2;
    //WriteFlashData(ADDR_FLASH_SECTOR_9,flash_data,2);
    //ReadFlashData(ADDR_FLASH_SECTOR_9,flash_data_read,1);

    for(;;)
    {
//        PERI_1.LED_BLUE_STA=PERI_1.LED_BLUE_STA==0xA1?0xA0:0xA1;
        //PERI_1.MOTOR_1_STA=RELEASE_ONE;
      //  if(flash_data_read[0]==2)PERI_1.LED_GREEN_STA=0xA1;
        temp.fValue=SMBus_ReadTemp();
        switch(PERI_1.MOTOR_1_STA)
        {
            case RELEASE_ZERO://50 复位
            {
                __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,50);
//                __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,50); //75停 75-125逆时针转，25-75顺时针转
//                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4,50);
                break;
            }
            case RELEASE_ONE://75缩到第一个
            {
                __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,75);
                break;
            }
            case RELEASE_TWO://95转到第二个
            {
                __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 100);
                break;
            }
            case RELEASE_THREE://118转到第三个
            {
                __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 118);
                break;
            }
        }
        if(PERI_1.SERVO_STA==0xA1)
        {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 125);//顺时针最大速度
        }
        else
        {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 75); //停
        }

        if(PERI_1.LASER_STA==0xA1)
        {
            HAL_GPIO_WritePin(GPIOE,GPIO_PIN_9,GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GPIOE,GPIO_PIN_11,GPIO_PIN_RESET);
        }
        else
        {
            HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);
        }
        if(PERI_1.LED_WHITE_STA==0xA1)
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
        else
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
        if(PERI_1.LED_BLUE_STA==0xA1)
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
        else
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
        if(PERI_1.LED_GREEN_STA==0xA1)
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
        else
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
        if(PERI_1.LED_RED_STA==0xA1)
            HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
        else
            HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);

        osDelay(100);
    }
}
void StartKeyScanTask(void *argument)
{
    temp.fValue=SMBus_ReadTemp()+1.0;
    osDelay(1);
}
void StartBackupTask(void *argument);